
<script>
  //  JavaScript 词法和语法的代码分析
  // 利用正则文法 表示产生式

  let xregexp = {
    InputElement: /<Whitespace>|<LineTerminator>|<Comments>|<Token>/,
    Whitespace: / /,
    LineTerminator: /\n/,
    Comments: /\/\*([^*]|\*[^\/])*\*\/|\/\/[^\n]*/,
    Token: /<Literal>|<Keywords>|<Identifer>|<Punctuator>/,
    Literal: /<NumbericLiteral>|<BooleanLiteral>|<StringLiteral>|<NullLiteral>/,
    NumbericLiteral: /([1-9][0-9]*|0)\.[0-9]*|\.[0-9]+/,
    BooleanLiteral: /true|false/,
    StringLiteral: /\"([^"\n]|\\[\s\S])*\"/
  }
  // 利用 replace 替换匹配规则
  function compileRegExp(xregexp, name) {
    let regexp = xregexp[name].source.replace(/\<([^>]+)\>/g, function(str, $1) {
      return compileRegExp(xregexp, $1)
    })
    return regexp;
  }

  let regexp = compileRegExp(xregexp, "InputElement")
  console.log(JSON.stringify(regexp))
  console.log(new RegExp(regexp, "g"))
  
  function scan(str) { 
    let regexp = / |\n|\/\*([^*]|\*[^\/])*\*\/|\/\/[^\n]*|[1-9][0-9]*|0/g
    while(regexp.lastIndex < str.length) {
      let r = regexp.exec(str)
      // console.log(JSON.stringify(r[0]))
    }
  
  }
  
  
  scan(`
    23333
    17
    456
    //hello world
    /*hello world*/
    /*charlie*/
  `)
  
  
  </script>